<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>红酒销售管理系统 - 数据库表设计文档</title>
    <style>
        body {
            font-family: 'Microsoft YaHei', Arial, sans-serif;
            line-height: 1.6;
            margin: 0;
            padding: 20px;
            background-color: #f5f5f5;
        }
        .container {
            max-width: 1200px;
            margin: 0 auto;
            background-color: white;
            padding: 30px;
            border-radius: 8px;
            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
        }
        h1 {
            color: #722f37;
            text-align: center;
            border-bottom: 3px solid #722f37;
            padding-bottom: 10px;
        }
        h2 {
            color: #8b4513;
            border-left: 4px solid #722f37;
            padding-left: 15px;
            margin-top: 30px;
        }
        h3 {
            color: #654321;
            border-bottom: 1px solid #ddd;
            padding-bottom: 5px;
        }
        table {
            width: 100%;
            border-collapse: collapse;
            margin: 20px 0;
            font-size: 14px;
            background-color: white;
            box-shadow: 0 1px 3px rgba(0,0,0,0.1);
        }
        th {
            background: linear-gradient(135deg, #722f37, #8b4513);
            color: white;
            padding: 12px 8px;
            text-align: left;
            font-weight: bold;
        }
        td {
            padding: 10px 8px;
            border-bottom: 1px solid #ddd;
        }
        tr:nth-child(even) {
            background-color: #f9f9f9;
        }
        tr:hover {
            background-color: #f0f0f0;
        }
        .constraint-info {
            background-color: #fff8dc;
            border: 1px solid #deb887;
            border-radius: 5px;
            padding: 15px;
            margin: 15px 0;
        }
        .constraint-info h4 {
            color: #8b4513;
            margin-top: 0;
        }
        .constraint-info ul {
            margin: 10px 0;
            padding-left: 20px;
        }
        .constraint-info li {
            margin: 5px 0;
        }
        code {
            background-color: #f4f4f4;
            padding: 2px 5px;
            border-radius: 3px;
            font-family: 'Courier New', monospace;
            color: #d14;
        }
        .sql-block {
            background-color: #2d3748;
            color: #e2e8f0;
            padding: 15px;
            border-radius: 5px;
            font-family: 'Courier New', monospace;
            margin: 15px 0;
            overflow-x: auto;
        }
        .relationship-diagram {
            background-color: #f8f9fa;
            border: 2px solid #dee2e6;
            border-radius: 8px;
            padding: 20px;
            margin: 20px 0;
            text-align: center;
            font-family: monospace;
            font-size: 14px;
            line-height: 1.8;
        }
        .footer {
            margin-top: 40px;
            padding-top: 20px;
            border-top: 2px solid #722f37;
            text-align: center;
            color: #666;
            font-size: 12px;
        }
        .badge {
            display: inline-block;
            padding: 2px 8px;
            background-color: #722f37;
            color: white;
            border-radius: 12px;
            font-size: 12px;
            font-weight: bold;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>红酒销售管理系统 - 数据库表设计文档</h1>
        
        <h2>项目概述</h2>
        <p>红酒销售管理系统采用SQLite数据库，包含用户管理、商品管理和订单管理三个核心模块。系统支持用户注册登录、商品浏览购买、订单管理等完整业务流程。</p>

        <h2>数据库表结构</h2>

        <h3>1. 用户表 (user)</h3>
        <table>
            <thead>
                <tr>
                    <th>字段名</th>
                    <th>数据类型</th>
                    <th>长度</th>
                    <th>约束条件</th>
                    <th>默认值</th>
                    <th>字段说明</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td><code>user_id</code></td>
                    <td>INTEGER</td>
                    <td>-</td>
                    <td><span class="badge">PRIMARY KEY</span> AUTOINCREMENT</td>
                    <td>-</td>
                    <td>用户唯一标识，主键自增</td>
                </tr>
                <tr>
                    <td><code>username</code></td>
                    <td>VARCHAR</td>
                    <td>50</td>
                    <td>NOT NULL <span class="badge">UNIQUE</span></td>
                    <td>-</td>
                    <td>用户登录名，全局唯一</td>
                </tr>
                <tr>
                    <td><code>password</code></td>
                    <td>VARCHAR</td>
                    <td>100</td>
                    <td>NOT NULL</td>
                    <td>-</td>
                    <td>用户密码（支持加密存储）</td>
                </tr>
                <tr>
                    <td><code>address</code></td>
                    <td>VARCHAR</td>
                    <td>200</td>
                    <td>-</td>
                    <td>-</td>
                    <td>用户收货地址</td>
                </tr>
                <tr>
                    <td><code>phone</code></td>
                    <td>VARCHAR</td>
                    <td>20</td>
                    <td>-</td>
                    <td>-</td>
                    <td>用户联系电话</td>
                </tr>
                <tr>
                    <td><code>balance</code></td>
                    <td>REAL</td>
                    <td>-</td>
                    <td>DEFAULT 0.0 CHECK (balance >= 0)</td>
                    <td>0.0</td>
                    <td>账户余额，非负数</td>
                </tr>
                <tr>
                    <td><code>permission_level</code></td>
                    <td>VARCHAR</td>
                    <td>10</td>
                    <td>NOT NULL DEFAULT 'normal' CHECK (permission_level IN ('normal', 'admin'))</td>
                    <td>'normal'</td>
                    <td>用户权限等级</td>
                </tr>
            </tbody>
        </table>

        <div class="constraint-info">
            <h4>用户表约束详情：</h4>
            <ul>
                <li><strong>唯一性约束</strong>：username字段确保用户名唯一性，防止重复注册</li>
                <li><strong>非负约束</strong>：balance字段确保账户余额不能为负数</li>
                <li><strong>枚举约束</strong>：permission_level限制为'normal'（普通用户）或'admin'（管理员）</li>
                <li><strong>默认值</strong>：新用户默认余额为0.0，权限为normal</li>
            </ul>
        </div>

        <h3>2. 红酒商品表 (redwine)</h3>
        <table>
            <thead>
                <tr>
                    <th>字段名</th>
                    <th>数据类型</th>
                    <th>长度</th>
                    <th>约束条件</th>
                    <th>默认值</th>
                    <th>字段说明</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td><code>redwine_id</code></td>
                    <td>INTEGER</td>
                    <td>-</td>
                    <td><span class="badge">PRIMARY KEY</span> AUTOINCREMENT</td>
                    <td>-</td>
                    <td>红酒商品唯一标识，主键自增</td>
                </tr>
                <tr>
                    <td><code>name</code></td>
                    <td>VARCHAR</td>
                    <td>100</td>
                    <td>NOT NULL</td>
                    <td>-</td>
                    <td>红酒商品名称</td>
                </tr>
                <tr>
                    <td><code>stock</code></td>
                    <td>INTEGER</td>
                    <td>-</td>
                    <td>DEFAULT 0 CHECK (stock >= 0)</td>
                    <td>0</td>
                    <td>库存数量，非负数</td>
                </tr>
                <tr>
                    <td><code>price</code></td>
                    <td>REAL</td>
                    <td>-</td>
                    <td>CHECK (price >= 0)</td>
                    <td>-</td>
                    <td>商品价格，非负数</td>
                </tr>
                <tr>
                    <td><code>country</code></td>
                    <td>VARCHAR</td>
                    <td>50</td>
                    <td>-</td>
                    <td>-</td>
                    <td>产地国家</td>
                </tr>
                <tr>
                    <td><code>city</code></td>
                    <td>VARCHAR</td>
                    <td>50</td>
                    <td>-</td>
                    <td>-</td>
                    <td>产地城市</td>
                </tr>
                <tr>
                    <td><code>county</code></td>
                    <td>VARCHAR</td>
                    <td>50</td>
                    <td>-</td>
                    <td>-</td>
                    <td>产地县区</td>
                </tr>
            </tbody>
        </table>

        <div class="constraint-info">
            <h4>红酒表约束详情：</h4>
            <ul>
                <li><strong>非负约束</strong>：stock和price字段确保库存和价格不能为负数</li>
                <li><strong>必填约束</strong>：name字段为必填，确保商品有名称</li>
                <li><strong>默认值</strong>：新商品默认库存为0</li>
            </ul>
        </div>

        <h3>3. 订单表 (order)</h3>
        <table>
            <thead>
                <tr>
                    <th>字段名</th>
                    <th>数据类型</th>
                    <th>长度</th>
                    <th>约束条件</th>
                    <th>默认值</th>
                    <th>字段说明</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td><code>order_id</code></td>
                    <td>INTEGER</td>
                    <td>-</td>
                    <td><span class="badge">PRIMARY KEY</span> AUTOINCREMENT</td>
                    <td>-</td>
                    <td>订单唯一标识，主键自增</td>
                </tr>
                <tr>
                    <td><code>user_id</code></td>
                    <td>INTEGER</td>
                    <td>-</td>
                    <td>NOT NULL <span class="badge">FOREIGN KEY</span></td>
                    <td>-</td>
                    <td>下单用户ID，关联用户表</td>
                </tr>
                <tr>
                    <td><code>redwine_id</code></td>
                    <td>INTEGER</td>
                    <td>-</td>
                    <td>NOT NULL <span class="badge">FOREIGN KEY</span></td>
                    <td>-</td>
                    <td>购买商品ID，关联红酒表</td>
                </tr>
                <tr>
                    <td><code>quantity</code></td>
                    <td>INTEGER</td>
                    <td>-</td>
                    <td>NOT NULL CHECK (quantity > 0)</td>
                    <td>-</td>
                    <td>购买数量，必须大于0</td>
                </tr>
                <tr>
                    <td><code>status</code></td>
                    <td>VARCHAR</td>
                    <td>20</td>
                    <td>NOT NULL DEFAULT '未付款' CHECK (status IN ('未付款', '已付款', '待收货', '已完成'))</td>
                    <td>'未付款'</td>
                    <td>订单状态</td>
                </tr>
                <tr>
                    <td><code>online</code></td>
                    <td>INTEGER</td>
                    <td>-</td>
                    <td>NOT NULL DEFAULT 0 CHECK (online IN (0, 1))</td>
                    <td>0</td>
                    <td>订单类型：0线下，1线上</td>
                </tr>
                <tr>
                    <td><code>code</code></td>
                    <td>INTEGER</td>
                    <td>-</td>
                    <td>-</td>
                    <td>-</td>
                    <td>订单编码（系统生成）</td>
                </tr>
            </tbody>
        </table>

        <div class="constraint-info">
            <h4>外键关系详情：</h4>
            <div class="sql-block">
FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE CASCADE
FOREIGN KEY (redwine_id) REFERENCES redwine(redwine_id) ON DELETE CASCADE
            </div>
            
            <h4>订单表约束详情：</h4>
            <ul>
                <li><strong>外键约束</strong>：user_id和redwine_id分别关联用户表和红酒表，支持级联删除</li>
                <li><strong>正数约束</strong>：quantity字段确保购买数量必须大于0</li>
                <li><strong>状态约束</strong>：status字段限制为四种预定义状态</li>
                <li><strong>布尔约束</strong>：online字段限制为0（线下）或1（线上）</li>
                <li><strong>默认值</strong>：新订单默认状态为'未付款'，类型为线下订单</li>
            </ul>
        </div>

        <h2>表间关系设计</h2>

        <h3>实体关系图</h3>
        <div class="relationship-diagram">
用户表 (user) ——————————— 订单表 (order) ——————————— 红酒表 (redwine)<br>
     │                      │                        │<br>
     │ 1                    │ N              N      │ 1<br>
     │                      │                        │<br>
   user_id  ————————— user_id              redwine_id ————————— redwine_id
        </div>

        <h3>关系说明</h3>
        <div class="constraint-info">
            <h4>1. 用户 ↔ 订单：一对多关系</h4>
            <ul>
                <li>一个用户可以创建多个订单</li>
                <li>每个订单必须属于一个用户</li>
                <li>删除用户时级联删除其所有订单</li>
            </ul>
            
            <h4>2. 红酒 ↔ 订单：一对多关系</h4>
            <ul>
                <li>一种红酒可以被多个订单购买</li>
                <li>每个订单只能购买一种红酒</li>
                <li>删除红酒时级联删除相关订单</li>
            </ul>
        </div>

        <h2>数据完整性保障</h2>

        <h3>主键完整性</h3>
        <ul>
            <li>每表都有自增主键，确保记录唯一标识</li>
            <li>主键自动生成，避免重复和冲突</li>
        </ul>

        <h3>引用完整性</h3>
        <ul>
            <li>订单表通过外键约束维护与用户表、红酒表的一致性</li>
            <li>级联删除策略确保数据关联性和完整性</li>
        </ul>

        <h3>域完整性</h3>
        <ul>
            <li><strong>数值域</strong>：余额、库存、价格、数量等数值字段设置合理约束</li>
            <li><strong>字符域</strong>：用户名、权限等字符字段限制长度和枚举值</li>
            <li><strong>业务域</strong>：订单状态、在线标识等业务字段符合业务规则</li>
        </ul>

        <h3>用户定义完整性</h3>
        <ul>
            <li>用户名唯一性约束</li>
            <li>业务逻辑约束（如余额非负、数量正数等）</li>
            <li>枚举值约束（如权限级别、订单状态等）</li>
        </ul>

        <h2>性能优化建议</h2>

        <h3>索引策略</h3>
        <div class="sql-block">
-- 主键索引（自动创建）
-- user(user_id), redwine(redwine_id), order(order_id)

-- 唯一索引（自动创建）
-- user(username)

-- 建议创建的索引
CREATE INDEX idx_order_user_id ON `order`(user_id);
CREATE INDEX idx_order_redwine_id ON `order`(redwine_id);
CREATE INDEX idx_order_status ON `order`(status);
CREATE INDEX idx_user_permission ON user(permission_level);
        </div>

        <h3>查询优化</h3>
        <ul>
            <li>使用索引字段进行WHERE过滤</li>
            <li>避免在ORDER BY中使用非索引字段</li>
            <li>合理使用JOIN查询，利用外键关系</li>
        </ul>

        <h2>数据初始化</h2>

        <h3>默认管理员账户</h3>
        <p>系统启动时自动创建管理员账户：</p>
        <div class="sql-block">
INSERT OR IGNORE INTO user 
(user_id, username, password, address, phone, balance, permission_level) 
VALUES (0, 'admin', 'admin', '管理员地址', '00000000000', 0.0, 'admin');
        </div>

        <h3>初始化脚本</h3>
        <p>数据库初始化通过<code>DbInit.java</code>类完成：</p>
        <ul>
            <li>创建所有必要的表结构</li>
            <li>设置完整的约束条件</li>
            <li>插入默认管理员数据</li>
        </ul>

        <h2>业务规则映射</h2>

        <h3>用户管理</h3>
        <ul>
            <li>用户注册时自动分配normal权限</li>
            <li>管理员可以管理所有用户和商品</li>
            <li>用户余额支持充值和消费</li>
        </ul>

        <h3>商品管理</h3>
        <ul>
            <li>商品库存实时更新</li>
            <li>价格变更历史可扩展</li>
            <li>产地信息支持多级地理位置</li>
        </ul>

        <h3>订单管理</h3>
        <ul>
            <li>订单状态流转：未付款 → 已付款 → 待收货 → 已完成</li>
            <li>支持线上线下双渠道订单</li>
            <li>订单编码自动生成，便于追踪</li>
        </ul>

        <div class="footer">
            <p><strong>文档版本</strong>：v3.0 &nbsp;|&nbsp; <strong>创建时间</strong>：2024年12月 &nbsp;|&nbsp; <strong>更新记录</strong>：基于最新DbInit.java设计生成</p>
            <p><strong>维护团队</strong>：红酒销售管理系统开发团队</p>
        </div>
    </div>
</body>
</html>
